package cn.com.cifi.mars.util;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;

import cn.com.cifi.mars.bean.dto.MonitorConfigDetailDto;
import cn.com.cifi.mars.constant.ConditionTypeEnum;
import cn.com.cifi.mars.constant.Constants;
import lombok.extern.slf4j.Slf4j;

/**
 * 操作符工具类
 * @author Li
 *
 */
@Slf4j
public class OperatorUtils {

	
	/**
	 * 比较value值是否存在 true 存在 false 不存在
	 * @param md
	 * @param value
	 * @return
	 */
	public static boolean getDoesItMatch(MonitorConfigDetailDto md,double value) {
		// 运算符1(1无|2小于<|3小于等于≤)
		String operator_1=StrUtils.getOperator13Calculation(md.getOperator1());
		String operator_2 =StrUtils.getOperator24Calculation(md.getOperator2());
		String operator_3 =StrUtils.getOperator13Calculation(md.getOperator3());
		String operator_4 =StrUtils.getOperator24Calculation(md.getOperator4());
		// 最小值1
		double min_value1 = 0;//90
		if (md.getMinValue1() != null) {
			min_value1 = md.getMinValue1();
		}
		// 最大值1
		double max_value1 = 0;//0
		if (md.getMaxValue1() != null) {
			max_value1 = md.getMaxValue1();
		}
		// 最小值2
		double min_value2 = 0;//0
		if (md.getMinValue2() != null) {
			min_value2 = md.getMinValue2();
		}
		// 最大值2
		double max_value2 = 0;//0
		if (md.getMaxValue2() != null) {
			max_value2 = md.getMaxValue2();
		}
		//a>符号1 a<符号2 a>符号3 a<符号4
		// 返回操作符 2<3<4 || 5<6<7 (a>=0&&a<=5) && (a>=3 && a<=6)
		String message = "";//(66.09 3 90)
		if (StringUtils.isNotEmpty(operator_1)) {
			message+="("+ value + operator_1 + min_value1 ;
			if(StringUtils.isEmpty(operator_2)) {
				message+=")";
			}
		}
		if(StringUtils.isNotEmpty(operator_1) && StringUtils.isNotEmpty(operator_2)) {
			message+="&&";
		}
		if (StringUtils.isNotEmpty(operator_2)) {
			if(StringUtils.isEmpty(operator_1)) {
				message+="(";
			}
			message+=value+operator_2 + max_value1+")";
		}
		// 条件类型(0默认 1或|| 2且 &&)
		String condition_type =StrUtils.getConditionType(md.getConditionType());
		if (StringUtils.isEmpty(condition_type)) {
			//没有操作符
		}else {
			if(StringUtils.isEmpty(operator_1) && StringUtils.isEmpty(operator_2)) {
				// 操作符12没有 但是有条件 错误数据
				return false;
			}
			
			//有操作符
			message +=" " + condition_type+" " ;
			if (StringUtils.isNotEmpty(operator_3)) {
				message+="("+value+operator_3+min_value2 ;
				if(StringUtils.isEmpty(operator_4)) {
					message+=")";
				}
			}
			if(StringUtils.isNotEmpty(operator_3) && StringUtils.isNotEmpty(operator_4)) {
				message+="&&";
			}
			if (StringUtils.isNotEmpty(operator_4)) {
				if(StringUtils.isEmpty(operator_3)) {
					message+="(";
				}
				message+=value+operator_4 + max_value2+")";
			}
		}	
//		log.info("操作符:" + message);
		if(StringUtils.isEmpty(message)) {
			return false;
		}
		boolean flag = StrUtils.getEngineResult(message, "");	
		return flag;
	}
	
	
	
	/**
	 * 拼接操作符
	 * @param md
	 * @param value
	 * @return
	 */
	public static String splicingOperator(MonitorConfigDetailDto md,String name) {
		// 运算符1(1无|2小于<|3小于等于≤)
		String operator_1=StrUtils.getOperator13(md.getOperator1());
		String operator_2 =StrUtils.getOperator(md.getOperator2());
		String operator_3 =StrUtils.getOperator13(md.getOperator3());
		String operator_4 =StrUtils.getOperator(md.getOperator4());
		// 最小值1
		double min_value1 = 0;
		if (md.getMinValue1() != null) {
			min_value1 = md.getMinValue1();
		}
		// 最大值1
		double max_value1 = 0;
		if (md.getMaxValue1() != null) {
			max_value1 = md.getMaxValue1();
		}
		// 最小值2
		double min_value2 = 0;
		if (md.getMinValue2() != null) {
			min_value2 = md.getMinValue2();
		}
		// 最大值2
		double max_value2 = 0;
		if (md.getMaxValue2() != null) {
			max_value2 = md.getMaxValue2();
		}
		if(md.getUnit().equals("/")) {
			md.setUnit("");
		}
		//a>符号1 a<符号2 a>符号3 a<符号4
		// 返回操作符 2<3<4 || 5<6<7 (a>=0&&a<=5) && (a>=3 && a<=6)
		String message = name;
		if (StringUtils.isNotEmpty(operator_1)) {
			message+="("+operator_1+min_value1+md.getUnit() ;
			if(StringUtils.isEmpty(operator_2)) {
				message+=")";
			}
		}
		if(StringUtils.isNotEmpty(operator_1) && StringUtils.isNotEmpty(operator_2)) {
			message+=ConditionTypeEnum.TWO.getValue();
		}
		if (StringUtils.isNotEmpty(operator_2)) {
			if(StringUtils.isEmpty(operator_1)) {
				message+="(";
			}
			message+=operator_2 + max_value1+md.getUnit()+")";
		}
		// 条件类型(0默认 1或|| 2且 &&)
		String condition_type =md.getConditionType();
		if (condition_type.equals(ConditionTypeEnum.ZERO.getKey())) {
			//没有操作符
		}else {
			condition_type=ConditionTypeEnum.getValueByKey(condition_type);
			//有操作符
			message+=" " + condition_type+" " ;
			if (StringUtils.isNotEmpty(operator_3)) {
				message+="("+operator_3+min_value2+md.getUnit() ;
				if(StringUtils.isEmpty(operator_4)) {
					message+=")";
				}
			}
			if(StringUtils.isNotEmpty(operator_3) && StringUtils.isNotEmpty(operator_4)) {
				message+=ConditionTypeEnum.TWO.getValue();
			}
			if (StringUtils.isNotEmpty(operator_4)) {
				if(StringUtils.isEmpty(operator_3)) {
					message+="(";
				}
				message+=operator_4 + max_value2+md.getUnit()+")";
			}
		}	
//		log.info("操作符:" + message);
		return message;
	}
}
